# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)


# 指定可执行程序和源文件
# --------------------------------------------------
add_executable(app_demo.out main.c)


# 列表
# --------------------------------------------------
# 1. 定义列表
message(STATUS "==> 定义列表")
set(slist a b c d e)     # Creates the list "a;b;c;d;e"
message(STATUS "slist = ${slist}")
message("")

# 2. 获取列表长度
# list(LENGTH <list> <out-var>)
message(STATUS "==> 获取列表长度")
set(slist a b c d e)     # Creates the list "a;b;c;d;e"
list(LENGTH slist retVar)
message(STATUS "retVar = ${retVar}")
message("")

# 3. 返回列表元素
# list(GET <list> <element index> [<index> ...] <out-var>)
message(STATUS "==> 返回列表元素")
set(slist a b c d e)       # Creates the list "a;b;c;d;e"
list(GET slist 2 1 retVar) # 获取索引为2和1的元素，就是 c;b
message(STATUS "retVar = ${retVar}")
message("")

# 4. 将列表中的元素用连接字符串连接起来组成一个字符串，注意，此时返回的结果已经不是一个列表并且3.12.4版本才开始支持这个。
# list(JOIN <list> <glue> <out-var>)
message(STATUS "==> 返回连接列表的字符串")
set(slist a b c d e)                    # Creates the list "a;b;c;d;e"
IF(CMAKE_VERSION VERSION_LESS "3.12.4") # 先用一下控制语句 检查 CMake 版本是否 >= 3.12.4
    message(WARNING "CMake version ${CMAKE_VERSION} < 3.12.4, not support JOIN!")
	set(retVar "null")
ELSE()
	list(JOIN slist " " retVar)         # 将列表连接成字符串，并将
ENDIF()
message(STATUS "retVar = ${retVar}")
message("")

# 5. 返回子列表
# list(SUBLIST <list> <begin> <length> <out-var>)
message(STATUS "==> 返回子列表")
set(slist a b c d e)                    # Creates the list "a;b;c;d;e"
IF(CMAKE_VERSION VERSION_LESS "3.12.4") # 先用一下控制语句 检查 CMake 版本是否 >= 3.12.4
    message(WARNING "CMake version ${CMAKE_VERSION} < 3.12.4, not support SUBLIST!")
	set(retVar "null")
ELSE()
	list(SUBLIST slist 1 2 retVar)      # 从列表slist中截取索引1开始的2个元素组成新列表，这里就是b;c
ENDIF()
message(STATUS "retVar = ${retVar}")
message("")

# 6. 返回列表指定元素的索引，如果列表中有多个相同的搜索元素，则返回从左开始的第一个搜索的元素索引。
# list(FIND <list> <value> <out-var>)
message(STATUS "==> 返回列表指定元素的索引")
set(slist a b c d e b)         # Creates the list "a;b;c;d;e"
list(FIND slist b retVar)      # 从列表slist中获取元素b的索引
message(STATUS "retVar = ${retVar}")
message("")

# 7. 追加列表元素
# list(APPEND <list> [<element>...])
message(STATUS "==> 追加列表元素")
set(slist a b c d e)           # Creates the list "a;b;c;d;e"
set(ulist 1 2 3)               # Creates the list "a;b;c;d;e"
list(APPEND slist ${ulist})    # ulist 追加到 slist
message(STATUS "slist = ${slist}")
message("")

# 8. 过滤列表元素，根据正则表达式的模式串，从列表中包含或删除元素。REGEX 表示，匹配正则表达式。
# list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
message(STATUS "==> 过滤列表元素")
set(slist a.c b.c c.o b.o)
list(FILTER slist EXCLUDE REGEX "b.*") # 根据正则表达式，排除列表 a.c b.c c.o b.o 中符合 b.* 的元素。
set(ulist a.c b.c c.o b.o)
list(FILTER ulist INCLUDE REGEX "b.*") # 根据正则表达式，筛选出列表 a.c b.c c.o b.o 中符合 b.* 的元素。
message(STATUS "slist = ${slist} ulist=${ulist}")
message("")

# 9. 将元素插入到列表中的指定位置。
# list(INSERT <list> <index> [<element>...])
message(STATUS "==> 插入元素到指定位置")
set(slist a b c d e)
set(ulist 1 2 3)
list(INSERT slist 1 ${ulist}) # 向slist中索引为1的位置插入ulist
message(STATUS "slist = ${slist}")
message("")

# 10. 删除列表元素
message(STATUS "==> 删除列表元素")
# list(REMOVE_ITEM <list> <value>...)
set(slist a b a c d e a)
list(REMOVE_ITEM slist a)  # 删除值为 a 的元素，这里就变成了 b;c;d;e
message(STATUS "REMOVE_ITEM a, slist = ${slist}")
# list(REMOVE_AT <list> <index>...)
set(slist a b a c d e a)
list(REMOVE_AT slist 2 1)  # 删除索引为 2 和 1 的元素, 这里就变成了 a;c;d;e;a
message(STATUS "REMOVE_AT 2, slist = ${slist}")
# list(REMOVE_DUPLICATES <list>)
set(slist a b a c d e a)
list(REMOVE_DUPLICATES slist)  # 删除列表中的重复项。保留相对顺序。这里就变成了 a;b;c;d;e
message(STATUS "REMOVE_DUPLICATES, slist = ${slist}")
message("")

# 11. 列表排序
message(STATUS "==> 列表元素排序")
# list(REVERSE <list>)
set(slist a d c b ab dc eds awa iun uhn af)
list(REVERSE slist)  # 元素逆序
message(STATUS "slist = ${slist}")
# list(SORT <list>)
set(slist a d c b ab dc eds awa iun uhn af)
list(SORT slist) # 按字母顺序升序排序，区分大大小写(3.18.6开始，支持更多的参数配置)
message(STATUS "slist = ${slist}")
message("")